﻿using System;
using System.Net.Http;
using System.Net;
using System.Text;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
// ... 其他必要的命名空间被引入 ...

namespace WS1.Filets // 定义一个叫WS1.Filets的空间
{
    public class BasicAuthenticationAttribute : ActionFilterAttribute // 创建一个名为BasicAuthenticationAttribute的类，用于处理请求前的身份验证
    {
        private readonly string _username; // 存储正确的用户名
        private readonly string _password; // 存储正确的密码

        // 构造函数，当创建这个类的对象时需要提供正确的用户名和密码
        public BasicAuthenticationAttribute(string username, string password)
        {
            _username = username; // 初始化_username变量
            _password = password; // 初始化_password变量
        }

        // 当API动作执行之前会调用此方法，进行身份验证
        public override void OnActionExecuting(HttpActionContext context)
        {
            var authHeader = context.Request.Headers.Authorization; // 获取HTTP请求中的Authorization头部信息

            if (authHeader?.Scheme == "Basic") // 检查Scheme是否为"Basic"
            {
                // 将Base64编码的认证信息解码成ASCII字符串，并按冒号分割成用户名和密码
                var cred = Encoding.ASCII.GetString(Convert.FromBase64String(authHeader.Parameter)).Split(':');
                // 如果解码后的信息长度为2（意味着有用户名和密码），并且它们与预设的用户名和密码匹配，则允许继续执行
                if (cred.Length == 2 && cred[0] == _username && cred[1] == _password) return;
            }

            // 如果没有通过验证，返回401未授权状态，并提示客户端需要提供Basic认证
            context.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
            {
                Headers = { { "WWW-Authenticate", "Basic realm=\"BasicRealm\"" } }
            };
        }
    }
}